package offer.day34;

public class No58Second_LeftRotateString {
    /*
     * 面试题58：翻转字符串
     * 题目二：左旋转字符串
     * 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
     * 请定义一个函数实现字符串左旋转操作的功能。
     * 比如：输入字符串”abcdefg“和数字2，该函数返回左旋转两位得到的结果”cdefgab“
     *
     *
     * 思路：要找到左旋转时每个字符移动的规律，可以从first问题中得到启发：
     * 将字符串分为两部分：
     * 前m个字符要转移到后面，所以前面这些要转移的这些字符作为第一部分，剩下的字符作为第二部分
     * 1>  首先将两个部分的字符分别进行翻转
     * 2>  然后再对整个字符串进行翻转，然后得到左旋转m位的结果
     *
     * */
    public static void main(String[] args) {
        No58Second_LeftRotateString l = new No58Second_LeftRotateString();
        String s = "abcdefg";
        int m = 2;
        System.out.println("左旋转字符串" + m + "位：" + l.LeftRotateString(s, m));
    }

    private String LeftRotateString(String s, int m) {
        if (s == null || m > s.length() || m < 0) return null;
        if (m == 0) return s;
        char[] chars = s.toCharArray();
        chars = Reverse(chars, 0, m - 1);
        chars = Reverse(chars, m, chars.length - 1);
        chars = Reverse(chars, 0, chars.length - 1);
        return String.valueOf(chars);
    }

    private char[] Reverse(char[] c, int start, int end) {
        if (c == null || c.length == 0 || start >= end) {
            return c;
        }
        while (start < end) {
            char temp = c[start];
            c[start] = c[end];
            c[end] = temp;
            start++;
            end--;
        }
        return c;
    }
}
